package com.scienzeinternazionali.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import com.scienzeinternazionali.application.ConnectionManager;
import com.scienzeinternazionali.dto.Docente;
import com.scienzeinternazionali.dto.MaterialeDidattico;
import com.scienzeinternazionali.dto.Pubblicazione;
import com.scienzeinternazionali.dto.RisorsaWeb;
import com.scienzeinternazionali.exception.DataAccessException;
import com.scienzeinternazionali.exception.DataSourceException;
import com.scienzeinternazionali.exception.DocenteException;
import com.scienzeinternazionali.util.LogFactory;

public class DocenteDAO {

		
		  private static Logger logger = LogFactory.getLogger(LogFactory.SCIENZEINTERNAZIONALI);

		  private Statement st = null;
		  private ResultSet rs = null;
		  private Connection conn = null;
		  private PreparedStatement pstm = null;
/* da trasformare in inserisciDocente
		  public void inserisciPost(Post post)throws DataAccessException, PostException{
			  logger.debug("inserisciPost IN");
			  String insert;
			  try {
				    conn = ConnectionManager.getConnection();
				    insert = "INSERT into post (data_inserimento,data_ultima_modifica,titolo,post,id_user, stato, link, top) values (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,?,?,?,?,?,?)";
					logger.debug("insert :" + insert);
					pstm = conn.prepareStatement(insert);
					pstm.setString(1, post.getTitolo());
					pstm.setString(2, post.getPost());
					pstm.setString(3, post.getId_user());
					pstm.setInt(4, post.getStato());
					pstm.setString(5, post.getLink());
					pstm.setInt(6, post.getSticky());
					pstm.executeUpdate();
					pstm.close();
					}catch (SQLException e) {
						e.printStackTrace();
						logger.fatal(e.getMessage());
						throw new PostException("errore durante inserimento del post");
					} catch (Exception e) {
						e.printStackTrace();
						logger.fatal(e.getMessage());
						throw new DataAccessException("errore generale durante inserimento del post");
					} finally {
						ConnectionManager.closeAll(rs, pstm, conn);
						logger.debug("inserisciPost OUT");
					}
		  }
*/
		  /* da aggiornare successivamente in aggiornaDocente
		  public void aggiornaPost(Post post)throws DataAccessException, PostException{
			  logger.debug("aggiornaPost IN");
			  String update;
			  try {
				conn = ConnectionManager.getConnection();
				update = "UPDATE post set data_ultima_modifica = CURRENT_TIMESTAMP, titolo = ?,post = ?,id_user = ?, stato = ?, link = ?, top=? where id_post = ?";
				System.out.println(update);
				System.out.println("aggiornaPost post.getId_user() "+post.getId_user());
				System.out.println("aggiornaPost post.getStato()"+post.getStato());
				System.out.println("aggiornaPost post.getId_post()"+post.getId_post());
				System.out.println("aggiornaPost post.getLink()"+post.getLink());
			    logger.debug("update :" + update);
			    pstm = conn.prepareStatement(update);
			    pstm.setString(1, post.getTitolo());
			    pstm.setString(2, post.getPost());
			    pstm.setString(3, post.getId_user());
			    pstm.setInt(4, post.getStato());
			    pstm.setString(5, post.getLink());
			    pstm.setInt(6, post.getSticky());
			    pstm.setInt(7, post.getId_post());
			    pstm.executeUpdate();
			    pstm.close();	
			}catch (SQLException e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new PostException("errore durante l'aggiornameno del post");
			} catch (Exception e) {
				e.printStackTrace();
				logger.fatal(e.getMessage());
				throw new DataAccessException("errore generale durante l'aggiornamento del post");
			} finally {
				ConnectionManager.closeAll(rs, pstm, conn);
				logger.debug("aggiornaPost OUT");
			}
		  }
*/
		  
/**** non implemento il metodo per trovare il singolo docente dalla lista. i docenti sono pochi ****/
			public List<Docente> getDocenti() throws DataAccessException,DocenteException{
				logger.debug("getDocenti IN");
				List<Docente> elencoDocenti = new ArrayList<Docente>();
				try {
			        String sql= "SELECT d.id_docente,d.nome,d.cognome,d.mail,d.telefono,i.desc_insegnamento,d.fotografia,d.contatti_personali,i.programma,i.programma_lab,d.note,d.anno,mosca_chair_gallery,attivo FROM docenti d, insegnamenti i, r_docenti_insegnamenti r WHERE (mosca_chair_gallery is null OR mosca_chair_gallery = 2) and attivo=1 and (d.id_docente <> 99 and d.id_docente <> 100) AND i.id_insegnamento=r.id_insegnamento and r.id_docente=d.id_docente order by cognome";
			        logger.debug(sql);
			        conn = ConnectionManager.getConnection();
			        st = conn.createStatement();
			        rs = st.executeQuery(sql);
			        while (rs.next()) {
			        	Docente docente = new Docente();
			        	docente.setIdDocente(rs.getInt(1));
			        	docente.setNome(rs.getString(2));
			        	docente.setCognome(rs.getString(3));
			        	docente.setEmail(rs.getString(4));
			        	docente.setTelefono(rs.getString(5));
			        	docente.setMateria(rs.getString(6));
			        	docente.setFotografia(rs.getString(7));
			        	docente.setContatti_personali(rs.getString(8));
			        	docente.setProgramma(rs.getString(9));
			        	docente.setProgramma_lab(rs.getString(10));
			        	docente.setNote(rs.getString(11));
			        	docente.setAnno(rs.getString(12));
			        	docente.setMosca_chair(rs.getBoolean(13));
			        	docente.setAttivo(rs.getBoolean(14));
			        	elencoDocenti.add(docente);
				    }
				}catch (DataSourceException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException(e.getMessage());
				} catch (SQLException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DocenteException("errore generale durante il caricamento della lista dei docenti");
				} catch (Exception e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException("errore generale durante l'accesso al DB");
				} finally {
					ConnectionManager.closeAll(rs, pstm, conn);
					logger.debug("getDocenti OUT");
				}
				return elencoDocenti;
			}



			public List<Docente> getDocentiMosca() throws DataAccessException,DocenteException{
				logger.debug("getDocentiMosca IN");
				List<Docente> elencoDocenti = new ArrayList<Docente>();
				try {
			        String sql= "SELECT d.id_docente,d.nome,d.cognome,d.mail,d.telefono,i.desc_insegnamento,d.fotografia,d.contatti_personali,i.programma,i.programma_lab,d.note,d.anno,mosca_chair_gallery,attivo FROM docenti d, insegnamenti i, r_docenti_insegnamenti r WHERE (mosca_chair_gallery =1 OR mosca_chair_gallery = 2) and attivo=1 and (d.id_docente <> 99 and d.id_docente <> 100) AND i.id_insegnamento=r.id_insegnamento and r.id_docente=d.id_docente order by cognome";
			        logger.debug(sql);
			        conn = ConnectionManager.getConnection();
			        st = conn.createStatement();
			        rs = st.executeQuery(sql);
			        while (rs.next()) {
			        	Docente docente = new Docente();
			        	docente.setIdDocente(rs.getInt(1));
			        	docente.setNome(rs.getString(2));
			        	docente.setCognome(rs.getString(3));
			        	docente.setEmail(rs.getString(4));
			        	docente.setTelefono(rs.getString(5));
			        	docente.setMateria(rs.getString(6));
			        	docente.setFotografia(rs.getString(7));
			        	docente.setContatti_personali(rs.getString(8));
			        	docente.setProgramma(rs.getString(9));
			        	docente.setProgramma_lab(rs.getString(10));
			        	docente.setNote(rs.getString(11));
			        	docente.setAnno(rs.getString(12));
			        	docente.setMosca_chair(rs.getBoolean(13));
			        	docente.setAttivo(rs.getBoolean(14));
			        	elencoDocenti.add(docente);
				    }
				}catch (DataSourceException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException(e.getMessage());
				} catch (SQLException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DocenteException("errore generale durante il caricamento della lista dei docenti");
				} catch (Exception e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException("errore generale durante l'accesso al DB");
				} finally {
					ConnectionManager.closeAll(rs, pstm, conn);
					logger.debug("getDocentiMosca OUT");
				}
				return elencoDocenti;
			}

			public List<RisorsaWeb> getRisorseWeb(int idDocente) throws DataAccessException,DocenteException{
				logger.debug("getRisorseWeb IN");
				List<RisorsaWeb> elencoRisorse = new ArrayList<RisorsaWeb>();
				try {
			        String sql= "SELECT id_risorsa_web,desc_risorsa_web,link_risorsa_web FROM risorse_web WHERE id_docente="+idDocente;
			        logger.debug(sql);
			        System.out.println(sql);
			        conn = ConnectionManager.getConnection();
			        st = conn.createStatement();
			        rs = st.executeQuery(sql);
			        while (rs.next()) {
			        	RisorsaWeb rw = new RisorsaWeb();
			        	rw.setIdRisorsaWeb(rs.getInt(1));
			        	rw.setDescRisorsaWeb(rs.getString(2));
			        	rw.setLinkRisorsaWeb(rs.getString(3));
			        	elencoRisorse.add(rw);
				    }
				}catch (DataSourceException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException(e.getMessage());
				} catch (SQLException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DocenteException("errore generale durante il caricamento delle risorse web");
				} catch (Exception e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException("errore generale durante l'accesso al DB");
				} finally {
					ConnectionManager.closeAll(rs, pstm, conn);
					logger.debug("getRisorseWeb OUT");
				}
				return elencoRisorse;
			}
			public List<MaterialeDidattico> getMaterialeDidattico(int idDocente) throws DataAccessException,DocenteException{
				logger.debug("getMaterialeDidattico IN");
				List<MaterialeDidattico> elencoRisorse = new ArrayList<MaterialeDidattico>();
				try {
			        String sql= "SELECT id_materiale_didattico,desc_materiale_didattico,link_materiale_didattico FROM materiale_didattico WHERE id_docente ="+idDocente;
			        logger.debug(sql);
			        System.out.println(sql);
			        conn = ConnectionManager.getConnection();
			        st = conn.createStatement();
			        rs = st.executeQuery(sql);
			        while (rs.next()) {
			        	MaterialeDidattico md = new MaterialeDidattico();
			        	md.setIdMaterialeDidattico(rs.getInt(1));
			        	md.setDescMaterialeDidattico(rs.getString(2));
			        	md.setLinkcMaterialeDidattico(rs.getString(3));
			        	elencoRisorse.add(md);
				    }
				}catch (DataSourceException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException(e.getMessage());
				} catch (SQLException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DocenteException("errore generale durante il caricamento del materiale didattico");
				} catch (Exception e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException("errore generale durante l'accesso al DB");
				} finally {
					ConnectionManager.closeAll(rs, pstm, conn);
					logger.debug("getMaterialeDidattico OUT");
				}
				return elencoRisorse;
			}
			public List<Pubblicazione> getPubblicazioni(int idDocente) throws DataAccessException,DocenteException{
				logger.debug("getPubblicazioni IN");
				List<Pubblicazione> elencoPubblicazioni = new ArrayList<Pubblicazione>();
				try {
			        String sql= "SELECT id_pubblicazione,autore,titolo,link FROM pubblicazioni WHERE id_docente="+idDocente;
			        logger.debug(sql);
			        System.out.println(sql);
			        conn = ConnectionManager.getConnection();
			        st = conn.createStatement();
			        rs = st.executeQuery(sql);
			        while (rs.next()) {
			        	Pubblicazione pub = new Pubblicazione();
			        	pub.setIdPubblicazione(rs.getInt(1));
			        	pub.setAutore(rs.getString(2));
			        	pub.setTitolo(rs.getString(3));
			        	pub.setLink(rs.getString(4));
			        	elencoPubblicazioni.add(pub);
				    }
				}catch (DataSourceException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException(e.getMessage());
				} catch (SQLException e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DocenteException("errore generale durante il caricamento delle pubblicazioni");
				} catch (Exception e) {
					logger.fatal(e.getMessage());
					e.printStackTrace();
					throw new DataAccessException("errore generale durante l'accesso al DB");
				} finally {
					ConnectionManager.closeAll(rs, pstm, conn);
					logger.debug("getPubblicazioni OUT");
				}
				return elencoPubblicazioni;
			}

	}
